package com.imooc.SmartChargeStation.demo.netty.handlers;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.util.ReferenceCountUtil;
import lombok.extern.slf4j.Slf4j;

import java.nio.charset.StandardCharsets;

/**
 * author: zpy
 * description: 自定义服务端(入站)处理器
 * date: 2025/8/20
 */

@Slf4j
public class ImoocServerHandlerAdapter extends ChannelInboundHandlerAdapter {
/*
    怎么理解？
    此类实现的是继承ChannelInboundHandlerAdapter
    需要手动实现：1.类型转换 2.释放ByteBuf对象
 */

    /**
     * description: 客户端连接进来触发
     */
    @Override
    public void handlerAdded(ChannelHandlerContext ctx) throws Exception {
        log.info(">>>>>ChannelInboundHandlerAdapter有新的客户端连接："+ctx.channel().id().asLongText());
    }

    /**
     * description: 接收到消息触发
     */
    @Override
    public void channelRead(
            ChannelHandlerContext ctx,
            Object msg) throws Exception {
        //super.channelRead(ctx, msg);

        //强制转换为ByteBuf
        ByteBuf byteBuf = (ByteBuf) msg;
        String message = byteBuf.toString(StandardCharsets.UTF_8);

        log.info(">>>>>ChannelInboundHandlerAdapter收到的消息："+message);

        //将消息传递给下一个处理器
        ctx.fireChannelRead(msg);
/*
        释放ByteBuf对象的代码为什么不需要在这里写？
        //ReferenceCountUtil.release(msg);
        //byteBuf.release();
        因为它将消息传递给下一个处理器，释放的代码需要在下一个处理器中执行
*/
    }
}
